# -*- encoding: utf-8 -*-
"""

PyCharm 01demo.py
2024年10月23日23时07分
by wenyang

文件主要内容:
numpy的基本操作

"""
# 导入numpy库的常见的操作
import numpy as np

def main():
    arr_one = np.array([1, 3, 5, 7, 9])
    arr_two = np.array((1, 3, 4, 5, 7))
    arr_three = np.array([[1, 3, 5], [2, 4, 6]])
    print(arr_one)
    print(arr_one.shape)
    print(arr_one.size) # size就是指的元素的个数 一个数组一旦创建完毕 就是固定的 无法进行修改
    print(type(arr_one))
    print(arr_two)
    print(arr_three)
    print(arr_three.size)
    print(arr_three.shape)
    # 通过使用np.ndim可以获取数组的维度
    print(arr_one.ndim)
    print(arr_two.ndim)
    print(arr_three.ndim)
    # 索引和切片操作和python的列表操作是一样的
    print(arr_one[1:]) # 从索引为1的位置开始到最后
    print(arr_one[::-1]) # 逆序
    # 也可以通过使用索引来对数组进行操作 将值进行改变
    arr_one[0] = 10
    print(arr_one)
    print(arr_one[0:-1]) # 最后一个元素不取
    # 二维数组的索引和操作
    print(arr_three[0, 1]) # 获取二维数组的第一行第二列的元素
    print(arr_three[:, 1]) # 获取二维数组的第二列元素
    print(arr_three[1, :]) # 获取二维数组的第二行元素
    print(arr_three[:, 1:]) # 获取二维数组的第二列和第三列的元素组成的一个数组
    print(arr_three[0, :]) # 可以获取二维数组的第一行的元素
    # array的一些属性 ndim就是可以获取数组的维度 通过使用shape就是可以获取数组的形状 通过使用shape就是可以获取数组的元素的个数 通过使用dtype就是可以后去数组的数据类型
    print(arr_one.ndim)
    print(arr_one.shape)
    print(arr_one.size)
    print(arr_one.dtype)

    arr_four = np.array([1, 3, 4, 5], dtype = np.float32)
    print(arr_four.dtype)
    print(arr_four)
    arr_five = np.array([[1, 3, 4, 5, 6], [2, 4, 6, 8, 10]], dtype = np.int32)
    print(arr_five.ndim)
    print(arr_five.shape)
    print(arr_five.dtype)
    print(arr_five.size)
    # 创建一些基础的数组
    arr_six = np.zeros(shape = (3, 4))
    print(arr_six)
    print(arr_six.size)
    print(arr_six.shape)
    print(arr_six.dtype)
    arr_seven = np.zeros(10) # 默认就是一维的数组
    print(arr_seven)
    # 创建一个全是1的数组
    arr_eight = np.ones(shape = (3, 4))
    print(arr_eight)
    arr_nine = np.ones(10)
    print(arr_nine)
    print(np.empty(shape = (3, 4)))
    print(np.empty(10))
    # 通过使用arange来创建一个数组 numpy中的arange的使用方法和列表的range的使用方法是一样的
    arr_ten = np.arange(10, dtype = np.float32)
    print(arr_ten)
    arr_eleven = np.arange(1, 10, 2) # 结果是左闭右开的区间
    print(arr_eleven)
    # 通过使用linspace可以创建一个等差数列 可以指定开始和结束的位置 以及元素的个数
    print(np.linspace(1, 10, 100))
    print(np.linspace(1, 100, 100))
    print(np.linspace(1, 10, 5).size)
    print(np.linspace(1, 10, 5).shape)
    # 可以通过使用sort函数来对数组进行排序
    print(np.sort(np.array([3, 1, 5, 7, 9, 2]))) # 只是返回的是一个数组的副本 原来的数组是不改变的 默认就是按照升序进行排序的
    # 通过使用reshape函数可以对数组进行形状的改变
    print(np.arange(10).reshape(2, 5))
    # 通过使用concatenate函数就是可以对数组进行拼接操作
    arr1 = np.array([3, 4, 5, 5])
    arr2 = np.array([5, 2, 9, 9])
    print(np.concatenate((arr1, arr2), axis = 0)) # 默认是按照行进行拼接的
    arr3 = np.arange(8).reshape(2, 4)
    arr4 = np.arange(1, 9).reshape(2, 4)
    print(arr3)
    print(np.concatenate((arr3, [arr2]), axis = 0)) # 如果是二维数组的话 那么0就是对应的就是列 1就是对应的就是行
    print(np.concatenate((arr3, arr4), axis = 1))
    # 对于二维数组而言 axis = 0就是对应的就是列 axis = 1 就是对应的就是行
    arr5 = np.arange(8).reshape(2, 4)
    arr6 = np.arange(8).reshape(2, 4)
    print(np.concatenate((arr5, arr6), axis = 0)) # 此时就是将列进行拼接操作
    print(np.concatenate((arr5, arr6), axis = 1)) # 此时就是对应的就是对行进行拼接操作
    # 通过使用stack就是可以对数组进行堆叠操作
    arr7 = np.arange(8).reshape(4, 2)
    arr8 = np.arange(4).reshape(4, 1)
    print(np.hstack((arr7, arr8)))
    # 通过使用rng来创建随机数的生成器
    rng = np.random.default_rng() # 通过这种方式就是可以创建一个默认的随机数生成器
    print(rng.random(10))
    print(rng.standard_normal((10, 10)))
    print(rng.integers(low = 1, high = 10, size = (3, 4)))
    print(rng.random(1) * 2 + 3)







if __name__ == "__main__":
    main()
